package com.mall.order.biz.factory;/**
 * Created by cskaoyan on 2019/8/2.
 */

import com.mall.commons.result.AbstractRequest;
import com.mall.order.biz.handler.DefaultTransPipeline;
import com.mall.order.biz.handler.TransPipeline;
import com.mall.order.biz.context.AbsTransHandlerContext;
import com.mall.order.biz.context.TransHandlerContext;
import com.mall.order.biz.TransOutboundInvoker;
import com.mall.order.biz.convert.TransConvert;

/**
 *  cskaoyan
 */
public abstract class AbstranctTransPipelineFactory <T extends AbstractRequest> implements TransPipelineFactory<T>{

    @Override
    public final TransOutboundInvoker build(T obj) {

        //创建转换器  CreateOrderConvert
        TransConvert convert = createConvert();

        //创建上下文 创建一个流水线的产品  本质 new CreateOrderContext();
        TransHandlerContext context = createContext();

        //上朔  向上转型为抽象类
        AbsTransHandlerContext absCtx = (AbsTransHandlerContext) context;

        //set转换器  抽象类中的convert为null  给其赋值
        absCtx.setConvert(convert);

        //******************将request转化为context这个产品
        //上下文转换 obj = request     将request转化为context   context=new CreateOrderContext();
        // 将CreateOrderRequest转换为CreateOrderContext  对context中的字段赋值
        convert.convertRequest2Ctx(obj, context);   //内部：使用CreateOrderConvert  将CreateOrderRequest转化为CreateOrderContext

        //******************产品放入新建的管道
        //创建管道  将产品放入
        TransPipeline pipeline = createPipeline(context);

        //******************将工人添加到管道（内部：尾插法）（从容器中取出各个handler，添加到管道pipeline）
        //build管道  将容器中的Handler添加到管道的尾部
        doBuild(pipeline);
        //返回
        return pipeline;
    }

    protected abstract TransHandlerContext createContext();

    protected abstract void doBuild(TransPipeline pipeline);

    protected TransPipeline createPipeline(TransHandlerContext context) {
        return new DefaultTransPipeline(context);
    }

    protected abstract TransConvert createConvert();
}
